#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include "Util.hpp"
#include <mutex>

#define CONFIG_FILE "./data.conf"
namespace hhbcloud
{
    class Config // 类的作用是获取配置文件中的数据，成员变量即为配置文件中所有的内容
    {
    public:
        // 因为整个系统同一时刻只需要一个读取配置文件的类，因此把他设计成单例模式，并使用懒汉模式提高局部性能
        static Config* GetInstance() // 不需要创建类对象，所以静态成员函数
        {
            if (_instance == nullptr)
            {
                _mutex.lock(); // 由于此处加锁会极大的影响效率，所以在外部加一层判断，提高效率
                if (_instance == nullptr) // 此处需要加锁，防止多线程出错
                {
                    _instance = new Config();
                }
                _mutex.unlock();
            }
            return _instance;
        }

        // 获取热点管理时间
        int GetHotTime()
        {
            return _hot_time;
        }

        // 获取服务器监听ip
        std::string GetServerIp()
        {
            return _server_ip;
        }
        // 获取服务器监听port
        int GetServerPort()
        {
            return _server_port;
        }

        // 获取下载文件的url前缀
        std::string GetDownloadPrefix()
        {
            return _download_prefix;
        }

        // 获取压缩文件的后缀
        std::string GetPackfileSuffix()
        {
            return _packfile_suffix;
        }

        // 获取压缩文件的存储路径
        std::string GetPackDir()
        {
            return _pack_dir;
        }

        // 获取备份文件的存储路径
        std::string GetBackDir()
        {
            return _back_dir;
        }

        // 获取所有文件备份信息的文件
        std::string GetBackupFile()
        {
            return _backup_file;
        }
    private:
        Config()
        {
            ReadConfigFile(); // 在创建对象时，调用读取文件信息的函数
        }

        bool ReadConfigFile() // 利用文件管理工具和json序列化反序列化工具，将配置文件的内容读到config对象中
        {
            FileUtil fu(CONFIG_FILE);
            std::string body;
            fu.GetContent(&body); // 获取整个文件的内容

            // 将字符串反序列化为JSON结构体
            Json::Value root;
            JsonUtil::Deserialization(body, &root);

            _hot_time = root["hot_time"].asInt();
            _server_ip = root["server_ip"].asString();
            _server_port = root["server_port"].asInt();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asString();
            _pack_dir = root["pack_dir"].asString();
            _back_dir = root["back_dir"].asString();
            _backup_file = root["backup_file"].asString();
        }

    private:
        int _hot_time; // 热点判断时间
        std::string _server_ip; // 服务器监听ip
        int _server_port; // 服务器监听端口
        std::string _download_prefix; // 下载文件的url前缀
        std::string _packfile_suffix; // 压缩文件的后缀
        std::string _pack_dir; // 压缩文件的存储路径
        std::string _back_dir; // 备份文件的存储路径
        std::string _backup_file; // 备份文件信息的存储文件

        // 外部使用config时，使用GetInstance函数，因为其是静态，无法访问非静态成员变量，所以将_instance设置为静态
        static Config* _instance; // 懒汉模式，默认先创建一个指针，需要的时候在实例化对象
        static std::mutex _mutex; // 懒汉模式在实例化对象时，需要加锁

    };

    Config* Config::_instance = nullptr; // 静态成员变量默认在类外定义
    std::mutex Config::_mutex;
}






#endif